package systemapi

import (
	"go-middle/app/admin/service/adminservice"
	"go-middle/app/admin/service/loginservice"
	"go-middle/app/common/model/admin"
	"go-middle/app/common/model/menu"
	"go-middle/app/common/model/role"
	"go-middle/app/common/model/role_has_menu"
	"go-middle/library/response"

	"github.com/gogf/gf/container/garray"
	"github.com/gogf/gf/net/ghttp"
	"github.com/gogf/gf/os/glog"
	"github.com/gogf/gf/util/gvalid"
)

// Clear    清理缓存
// @Tags    系统管理
// @Summary 清理缓存
// @Accept  multipart/form-data
// @Produce  json
// @Success 200 {object} response.JsonResponse
// @Router /api/system/clear [get]
// @Security ApiKeyAuth
func Clear(r *ghttp.Request) {
	response.JsonExit(r, 1, "服务端清理缓存成功", nil)
}

// Menu     获取菜单
// @Tags    登录
// @Summary 获取菜单
// @Accept  multipart/form-data
// @Produce  json
// @Success 200 {object} adminservice.SystemInit "json 对象"
// @Router /api/menu [get]
// @Security ApiKeyAuth
func Menu(r *ghttp.Request) {
	var user admin.Entity
	_ = r.Session.GetStruct(loginservice.AdminInfo, &user)
	list := adminservice.GetSystemInit(user.Id, user.Roles)
	r.Response.WriteExit(list)
	r.ExitAll()
}

// Permission 获取权限列表
// @Tags    登录
// @Summary 获取权限列表
// @Accept  multipart/form-data
// @Produce  json
// @Success 200 {object} menu.Entity "count 总数 data 列表"
// @Router /api/system/permission [get]
// @Security ApiKeyAuth
func Permission(r *ghttp.Request) {
	count, list := adminservice.GetPermission()
	if count == 0 {
		response.SuccessList(r, count, garray.New())
	}
	response.SuccessList(r, count, list)
}

// MenuAdd  添加菜单
// @Tags    系统管理
// @Summary 添加菜单
// @Accept   json
// @Produce  json
// @Param body body menu.ReqAdd true "Add menu"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/menu [post]
// @Security ApiKeyAuth
func MenuAdd(r *ghttp.Request) {
	var req menu.ReqAdd
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	err := adminservice.SaveMenu(req)
	if err != nil {
		response.Error(r, err.Error(), nil)
	}
	response.Success(r, "操作成功", nil)
}

// MenuEdit  编辑菜单
// @Tags    系统管理
// @Summary 编辑菜单
// @Accept   json
// @Produce  json
// @Param body body menu.ReqEdit true "Edit menu"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/menu [put]
// @Security ApiKeyAuth
func MenuEdit(r *ghttp.Request) {
	var req menu.ReqEdit
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	err := adminservice.SaveMenu(req)
	if err != nil {
		response.Error(r, err.Error(), nil)
	}
	response.Success(r, "操作成功", nil)
}

// MenuDelete 删除菜单
// @Tags    系统管理
// @Summary 删除菜单
// @Accept  multipart/form-data
// @Produce  json
// @Param   id formData int true  "菜单ID"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/menu [delete]
// @Security ApiKeyAuth
func MenuDelete(r *ghttp.Request) {
	id := r.GetInt64("id", 0)
	err := gvalid.Check(id, "required|min:1", "菜单ID不能为空|ID错误")
	if err != nil {
		response.Error(r, err.String(), nil)
	}
	e := adminservice.DelMenu(id)
	if e != nil {
		glog.Error("[删除菜单]", e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// Admin    用户列表
// @Tags    系统管理
// @Summary 用户列表
// @Accept   json
// @Produce  json
// @Param    body  body admin.SelectPageReq false "搜索"
// @Success 200 {object} admin.RespUserInfo "count 总数 data 列表"
// @Router /api/system/admin [get]
// @Security ApiKeyAuth
func Admin(r *ghttp.Request) {
	var req admin.SelectPageReq
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	count, list := adminservice.GetAdminList(req)
	if count == 0 {
		response.SuccessList(r, count, garray.New())
	}
	response.SuccessList(r, count, list)
}

//AdminAdd  添加用户
// @Tags    系统管理
// @Summary 添加用户
// @Accept   json
// @Produce  json
// @Param body body admin.ReqAdd true "添加用户"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/admin [post]
// @Security ApiKeyAuth
func AdminAdd(r *ghttp.Request) {
	var req admin.ReqAdd
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	err := adminservice.SaveAdmin(req)
	if err != nil {
		response.Error(r, err.Error(), nil)
	}
	response.Success(r, "操作成功", nil)
}

// AdminEdit 编辑用户
// @Tags    系统管理
// @Summary 编辑用户
// @Accept   json
// @Produce  json
// @Param body body admin.ReqEdit true "编辑用户"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/admin [put]
// @Security ApiKeyAuth
func AdminEdit(r *ghttp.Request) {
	var req admin.ReqEdit
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	if req.Id <= 1 {
		response.Error(r, "ID不正确", nil)
	}
	err := adminservice.SaveAdmin(req)
	if err != nil {
		response.Error(r, err.Error(), nil)
	}
	response.Success(r, "操作成功", nil)
}

// AdminDelete 删除用户
// @Tags    系统管理
// @Summary 删除用户
// @Accept  json
// @Produce  json
// @Param   body body admin.ReqDelete true  "用户ID数组"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/admin [delete]
// @Security ApiKeyAuth
func AdminDelete(r *ghttp.Request) {
	var req admin.ReqDelete
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	e := adminservice.DelAdmin(req.Ids)
	if e != nil {
		glog.Error("[删除用户]", e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// AdminResetPwd 重置密码
// @Tags    系统管理
// @Summary 重置密码
// @Accept  multipart/form-data
// @Produce  json
// @Param   id formData int true  "用户ID"
// @Param   password formData string true  "密码"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/admin/reset_pwd [post]
// @Security ApiKeyAuth
func AdminResetPwd(r *ghttp.Request) {
	id := r.GetInt64("id", 0)
	if id <= 1 {
		response.Error(r, "ID不正确", nil)
	}
	pwd := r.GetString("password", "")
	err := adminservice.ResetPwd(id, pwd)
	if err != nil {
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// Role     角色列表
// @Tags    系统管理
// @Summary 角色列表,默认每页15个
// @Accept  multipart/form-data
// @Produce  json
// @Param   page formData int false  "页码"
// @Param   name formData string false  "角色名"
// @Success 200 {object} role.Entity "json 对象"
// @Router /api/system/role [get]
// @Security ApiKeyAuth
func Role(r *ghttp.Request) {
	page := r.GetInt("page", 1)
	name := r.GetString("name", "")
	total, list := role.GetList(page, name)
	if total == 0 {
		response.SuccessList(r, total, garray.New())
	}
	response.SuccessList(r, total, list)
}

// RoleRemoveUser 把用户从指定角色移除
// @Tags    系统管理
// @Summary 把用户从指定角色移除
// @Accept  json
// @Produce  json
// @Param   body body role.ReqRoleUser true "角色分配"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/role/user [delete]
// @Security ApiKeyAuth
func RoleRemoveUser(r *ghttp.Request) {
	var req role.ReqRoleUser
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	e := adminservice.DelRoleHasAdmin(req)
	if e != nil {
		glog.Error("[角色移除用户]", e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// RoleAddUser 把用户加入指定角色
// @Tags    系统管理
// @Summary 把用户加入指定角色
// @Accept  json
// @Produce  json
// @Param   body body role.ReqRoleUser true "角色分配"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/role/user [post]
// @Security ApiKeyAuth
func RoleAddUser(r *ghttp.Request) {
	var req role.ReqRoleUser
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	e := adminservice.AddRoleHasAdmin(req)
	if e != nil {
		glog.Error("[角色添加用户]", e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// RoleDelete 删除角色
// @Tags    系统管理
// @Summary 删除角色
// @Accept  multipart/form-data
// @Produce  json
// @Param   id formData int true "角色ID"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/role [DELETE]
// @Security ApiKeyAuth
func RoleDelete(r *ghttp.Request) {
	id := r.GetInt("id", 0)
	if id <= 0 {
		response.Error(r, "ID不正确", nil)
	}
	e := adminservice.RoleDelete(id)
	if e != nil {
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// RoleAdd  添加角色
// @Tags    系统管理
// @Summary 添加角色
// @Accept  json
// @Produce  json
// @Param   body body role.ReqRoleAdd true "添加角色"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/role [POST]
// @Security ApiKeyAuth
func RoleAdd(r *ghttp.Request) {
	var req role.ReqRoleAdd
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	e := adminservice.SaveRole(req)
	if e != nil {
		glog.Error(e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// RoleEdit 修改角色
// @Tags    系统管理
// @Summary 修改角色
// @Accept  json
// @Produce  json
// @Param   body body role.ReqRoleEdit true "编辑角色"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/role [PUT]
// @Security ApiKeyAuth
func RoleEdit(r *ghttp.Request) {
	var req role.ReqRoleEdit
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	e := adminservice.SaveRole(req)
	if e != nil {
		glog.Error(e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}

// RolePermission 获取权限列表树
// @Tags    登录
// @Summary 获取权限列表树
// @Accept  multipart/form-data
// @Produce  json
// @Param   role_id formData int false  "角色ID"
// @Success 200 {object} menu.TreeListPermission
// @Router /api/system/role/permission [get]
// @Security ApiKeyAuth
func RolePermission(r *ghttp.Request) {
	roleID := r.GetInt("role_id", 0)
	list := adminservice.GetPermissionTree(roleID)
	response.Success(r, "success", list)
}

// RolePermissionEdit 角色权限分配
// @Tags    系统管理
// @Summary 角色权限分配
// @Accept  json
// @Produce  json
// @Param   body body role_has_menu.ReqRolePermission true "权限分配"
// @Success 200 {object} response.JsonResponse
// @Router /api/system/role/permission [PUT]
// @Security ApiKeyAuth
func RolePermissionEdit(r *ghttp.Request) {
	var req role_has_menu.ReqRolePermission
	//获取参数
	if err := r.Parse(&req); err != nil {
		response.Error(r, err.Error(), nil)
	}
	e := adminservice.SaveRoleHasMenu(req)
	if e != nil {
		glog.Error(e)
		response.Error(r, "操作失败", nil)
	}
	response.Success(r, "操作成功", nil)
}
